//
//  LRCellPictureView.swift
//  LRWeibo
//
//  Created by 雷路荣 on 15/12/21.
//  Copyright © 2015年 leilurong. All rights reserved.
//

import UIKit

import SDWebImage

// 放到类外面,全局都可以访问
// cell点击时通知的名称
let LRCellPictureViewSelectNotification = "LRCellPictureViewSelectNotification"

// cell点击时通知的indexPath的key
let LRCellPictureViewSelectIndexPathKey = "LRCellPictureViewSelectIndexPathKey"

// cell点击时通知的urls的key
let LRCellPictureViewSelectModelsKey = "LRCellPictureViewSelectModelsKey"

class LRCellPictureView: UICollectionView, UICollectionViewDataSource, UICollectionViewDelegate { // 继承 UICollectionView

    //MARK - 属性
    private let reuserIdentifier = "LRCellPictureViewReuserIdentifier"
    /// 微博模型,用于显示图片和计算配图视图的尺寸
    var statues: LRStatues? {
        didSet{
            // 防止cell重用,需要刷新数据，每次赋值数据就刷新
            self.reloadData()
        }
    }
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    /**
     计算配图view的尺寸,根据模型里面图片的数量来计算
     - returns: 计算好的宽高
     */
    func calculateViewSize() -> CGSize {
        //间距
        let margin: CGFloat = 10
        
        let itemSize = CGSize(width: 88, height: 98)
        //设置layout参数 cell大小
        layout.itemSize = itemSize
        //间距
        layout.minimumInteritemSpacing = 0
        layout.minimumLineSpacing = 0
        // 获取图片数量,如果没有值,默认为0
        let count = statues?.pictureURLs?.count ?? 0
        //如果没有图片
        if count==0 {
            return CGSizeZero
        }
        // 1张图片,返回图片的大小
        if count==1 {
            // 单张图片显示图片原本的大小
            // 需要知道图片的大小,因为新浪的api没有返回图片大小
            // 先将图片下载到本地(SDWebImage).然后就可以获取到图片的大小
            var size = CGSize(width: 150, height: 100)// 默认大小,有些图片缓存失败显示默认大小
            // 判断图片是否缓存了.如果有缓存图片,获取图片的大小
            // 获取图片的url
            let url = statues!.pictureURLs![0]
            // 获取图片.之前使用SDWebImage缓存的图片.现在使用SDWebImage来加载图片
            // key: 图片的url地址,String类型
            if let image = SDImageCache.sharedImageCache().imageFromDiskCacheForKey(url.absoluteString) {
                // 有图片,设置itemSize为图片的大小
                size = image.size
            }
            if size.width < 40 {
                size.width = 40
            }else if size.width > UIScreen.mainScreen().bounds.width * 0.5 {
                size.width = UIScreen.mainScreen().bounds.width * 0.5
            }
            // 设置itemSize
            layout.itemSize = size
            return size
        }
        layout.minimumInteritemSpacing = margin
        layout.minimumLineSpacing = margin
        // 4张图片
        if count==4 {
            let widthValue = 2 * itemSize.width + margin
            let heightValue = 2 * itemSize.height + margin
            return CGSize(width: widthValue, height: heightValue)
        }
        // 其他情况
        // 列数,行数计算依赖列数,colNum必须为Int
        let colNum = 3
        // 宽度 = 列数 * cell的宽度 + (列数 - 1) * 间距
        let width = CGFloat(colNum)*itemSize.width + (CGFloat(colNum)-1) * margin
        // 行数 = (图片的数量(Int) + 列数(Int) - 1) / 列数(Int)
        /*
        (1 + 3 - 1) / 3 = 1
        (2 + 3 - 1) / 3 = 1
        (3 + 3 - 1) / 3 = 1
        (4 + 3 - 1) / 3 = 2
        (5 + 3 - 1) / 3 = 2
        (6 + 3 - 1) / 3 = 2
        (7 + 3 - 1) / 3 = 3
        (8 + 3 - 1) / 3 = 3
        (9 + 3 - 1) / 3 = 3
        */
        let row = (count + colNum - 1)/colNum
        // 高度 = 行数 * cell的高度 + (行数 - 1) * 间距
        let height = CGFloat(row) * itemSize.height + (CGFloat(row) - 1) * margin
        return CGSize(width: width, height: height)
    }
    //流水布局
    let layout = UICollectionViewFlowLayout()
    //重写系统构造方法
    init(){
        // 我们里面调用需要布局的构造函数
        super.init(frame: CGRectZero, collectionViewLayout: layout)
        //注册cell
        self.registerClass(LRPictrueViewCell.self, forCellWithReuseIdentifier: reuserIdentifier)
        //设置数据源方法代理
        dataSource = self
        //设置代理
        delegate = self
        //去除背景色
        backgroundColor = UIColor.clearColor()

    }
    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return statues?.pictureURLs?.count ?? 0
    }
    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuserIdentifier, forIndexPath: indexPath) as! LRPictrueViewCell
        // 显示图片.获取图片的url  最好让模型来提供完善一点的数据,直接可以访问图片的NSURL
//        let urlString = status?.pic_urls?[indexPath.item]["thumbnail_pic"] as! String
//        // 转换为NSURL
//        let url = NSURL(string: urlString)
//        cell.imageURL = url
        cell.imageURL = self.statues?.pictureURLs![indexPath.item]
        return cell
    }
    func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
        /*
        1.代理
            1. 1对1
            2. 可以有返回值
            3. 嵌套层次不要太深
        2.通知
            1. 1对多
            2. 没有返回值
            3. 嵌套层次无所谓
        注意:
            1.通知是同步的
            2.在哪个线程发送通知,就在哪个线程接受通知
        */
//        // 打印点击cell对应的小图和大图
//        let url = statues!.pictureURLs![indexPath.item]
//        let largeUrl = statues!.largePictureURLs![indexPath.item]
        
        // 因为转场动画时需要知道缩略图ImageView的位置和图片,创建模型数组
        var photoBroserModels = [LRPhotoBrowserModal]()
        // 获取配图的数量
        let count = self.statues!.largePictureURLs!.count
        // 遍历每个缩略图.来创建模型数组
        for i in 0..<count {
            // 创建模型
            let model = LRPhotoBrowserModal()
            
            let url = self.statues?.largePictureURLs![i]
            // 设置模型大图url
            model.largeURL = url
            
            //获取cell
            let cell = collectionView.cellForItemAtIndexPath(NSIndexPath(forItem: i, inSection: 0)) as! LRPictrueViewCell
            // 设置模型小图
            model.imageView = cell.imageView
            photoBroserModels.append(model)
        }
        
        // 使用通知,让微博配图的点击事件传递给控制器
        // 发送通知,需要传递2个数据,1配图的大图url数组,2点击cell的indexPath
        NSNotificationCenter.defaultCenter().postNotificationName(LRCellPictureViewSelectNotification, object: self, userInfo: [LRCellPictureViewSelectIndexPathKey: indexPath,
             LRCellPictureViewSelectModelsKey: photoBroserModels])
    }
    
}


//MARK - 自定义UICollectionViewCell---------------------------------
class LRPictrueViewCell: UICollectionViewCell {
    //MARK - 属性
    /// 要显示图片的url
    var imageURL: NSURL? {
        didSet{
            //下载图片显示出来
            imageView.sd_setImageWithURL(imageURL)
            // 判断一个地址是否是gif地址
            let gif = imageURL!.absoluteString.lowercaseString.hasSuffix("gif")
            // 如果是gif图片才显示gif图标
            gifImageView.hidden = !gif
        }
    }
    //MARK: - 构造方法
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    override init(frame: CGRect) {
        super.init(frame: frame)
        contentView.addSubview(imageView)
        contentView.addSubview(gifImageView)
        imageView.ff_Fill(contentView)
        gifImageView.ff_AlignInner(type: ff_AlignType.BottomRight, referView: contentView, size: nil)
    }
    //MARK - 懒加载图片
    private lazy var imageView:UIImageView = {
        let imageView = UIImageView()
        // 设置图片的填充模式
        imageView.contentMode = UIViewContentMode.ScaleAspectFill
        imageView.clipsToBounds = true
        imageView.userInteractionEnabled = true
        return imageView
    }()
    ///gif图标
    private lazy var gifImageView: UIImageView = UIImageView(image: UIImage(named: "timeline_image_gif"));
}




